#include "config.h"

#ifdef MFG_LOG_ENABLE
#define MFG_PRINT(format, ...)  log_print(format, ##__VA_ARGS__)
#else
#define MFG_PRINT(format, ...)
#endif

/* 
1. 升级卡 --        刷卡进入OTA升级界面         OK
2. LOGO卡--         刷卡进入设置LOGO界面
3. 测试卡 --        刷卡进入测试模式            OK
4. 设置生产日期卡 -- 刷卡进入设置生产日期界面     OK
5. 设置QC码卡 --    刷卡进入设置QC码界面         OK
6. 配置卡 --        刷卡进入配置模式(配置开关锁按键选项、配置屏幕ID)
*/

/* 功能卡命令块，其中保存了功能卡的命令信息 */
#define RFID_FUNC_CMD_BLOCK         8
/* LOGO卡数据起始块，注意读取时需要跳过控制块 */
#define RFID_FUNC_DATA_BLOCK        9

/* 功能卡起始标志，第一个字节 */
#define RFID_FUNC_TAG_START         0xEF
/* 功能卡命令，进入固件升级模式 */
#define RFID_FUNC_CMD_UPGRADE       0x01
/* 功能卡命令，设置生产日期 */
#define RFID_FUNC_CMD_SET_MFG       0x02
/* 功能卡命令，设置LOGO */
#define RFID_FUNC_CMD_LOGO          0x03
/* 功能卡命令，系统配置 */
#define RFID_FUNC_CMD_CFG           0x04
/* 功能卡命令，进入测试模式 */
#define RFID_FUNC_CMD_TEST          0x05
/* 功能卡命令，设置质检员编号 */
#define RFID_FUNC_CMD_SET_QC_ID     0x06

/* 功能卡块数据结构 */
typedef struct
{
    uint8_t start;      /* 起始tag */
    uint8_t cmd;        /* 命令 */
    uint8_t lengthh;    /* 数据长度高字节 */
    uint8_t lengthl;    /* 数据长度低字节 */
    uint8_t rsvd[12];   /* 保留 */
} rfid_func_block_t;

typedef union
{
    rfid_func_block_t block;
    uint8_t buf[16];
}blk_data_t;

typedef struct
{
    uint8_t year_H;     /* 年高八位 */
    uint8_t year_L;     /* 年低八位 */
    uint8_t month;      /* 月 */
    uint8_t day;        /* 日 */
    uint8_t rsvd[12];   /* 保留 */
} mfg_date_t;
typedef union
{
    mfg_date_t date;
    uint8_t buf[16];
} blk_mfg_date_t;

typedef struct
{
    uint8_t QC_H;     /* QC高八位 */
    uint8_t QC_L;     /* QC低八位 */
    uint8_t rsvd[14];   /* 保留 */
} mfg_qc_t;
typedef union
{
    mfg_qc_t qc;
    uint8_t buf[16];
} blk_mfg_qc_t;


static void mfg_make_ota_card(void)
{
    int ret = 0;

    blk_data_t blk_data = {
        .block = {
            .start = RFID_FUNC_TAG_START,
            .cmd = RFID_FUNC_CMD_UPGRADE,
            .lengthh = 0,
            .lengthl = 0,
        },
    };
// 40 blk for test.
    ret = rc522_write_blk(RFID_FUNC_CMD_BLOCK, blk_data.buf);
    if(ret != 0) {
        MFG_PRINT("MFG make ota card FAILED\r\n");
    } else {
        MFG_PRINT("MFG make ota card SUCCESS\r\n");
    }
}


/* 测试项配置 */
typedef struct
{
    uint8_t voice;                  /* 语音 */
    uint8_t kb;                     /* 按键 */
    uint8_t pry;                    /* 防撬 */
    uint8_t card;                   /* 卡片 */
    uint8_t fp;                     /* 指纹 */
    uint8_t pir;                    /* 人体感应 */
    uint8_t face;                   /* 人脸 */
    uint8_t bell;                   /* 门铃 */
    uint8_t mb_open_close_lock;     /* 前板开关锁 */
    uint8_t pb_open_close_lock;     /* 后板开关锁 */
    uint8_t cateye;                 /* 猫眼/WIFI/IOT */
} fast_test_items_t;

// 测试卡
static void mfg_make_mfg_test_card(void)
{
    int ret = 0;

    blk_data_t blk_data = {
        .block = {
            .start = RFID_FUNC_TAG_START,
            .cmd = RFID_FUNC_CMD_TEST,
            .lengthh = 0,
            .lengthl = 11,
        },
    };

    ret = rc522_make_test_card(RFID_FUNC_CMD_BLOCK, blk_data.buf);
    if(ret != 0) {
        MFG_PRINT("MFG make ota card FAILED\r\n");
    } else {
        MFG_PRINT("MFG make ota card SUCCESS\r\n");
    }
}


// 设置生产日期
static void mfg_make_mfg_date_card(void)
{
    int ret = 0;

    uint16_t year = 2024;
    uint8_t month = 8;
    uint8_t day = 1;

    blk_data_t blk_data = {
        .block = {
            .start = RFID_FUNC_TAG_START,
            .cmd = RFID_FUNC_CMD_SET_MFG,
            .lengthh = 0,
            .lengthl = 4,
        },
    };

    blk_mfg_date_t blk_mfg_date = {
        .date = {
            .year_H = (year >> 8) & 0xFF,
            .year_L = year & 0xFF,
            .month = month,
            .day = day,
        },
    };

    ret = rc522_make_date_card(RFID_FUNC_CMD_BLOCK, blk_data.buf, blk_mfg_date.buf);
    if(ret != 0) {
        MFG_PRINT("MFG make date card FAILED\r\n");
    } else {
        MFG_PRINT("MFG make date card SUCCESS\r\n");
    }
}

// 设置QC码
static void mfg_make_mfg_qc_card(void)
{
    int ret = 0;

    uint16_t QC_id = 81;

    blk_data_t blk_data = {
        .block = {
            .start = RFID_FUNC_TAG_START,
            .cmd = RFID_FUNC_CMD_SET_QC_ID,
            .lengthh = 0,
            .lengthl = 2,
        },
    };

    blk_mfg_qc_t blk_mfg_qc = {
        .qc = {
            .QC_H = (QC_id >> 8) & 0xFF,
            .QC_L = QC_id & 0xFF,
        },
    };

    ret = rc522_make_date_card(RFID_FUNC_CMD_BLOCK, blk_data.buf, blk_mfg_qc.buf);
    if(ret != 0) {
        MFG_PRINT("MFG make QC card FAILED\r\n");
    } else {
        MFG_PRINT("MFG make QC card SUCCESS\r\n");
    }
}

int mfg_make_function_card(rfid_card_type_t type)
{
    if(type >= RFID_CARD_TYPE_MAX) {
        MFG_PRINT("MFG make card type ERROR(%d)\r\n", type);
        return -1;
    }

    switch (type)
    {
    case RFID_CARD_TYPE_UPGRADE:
        mfg_make_ota_card();
        break;
    case RFID_CARD_TYPE_CONFIG:
        break;
    case RFID_CARD_TYPE_LOGO:
        break;
    case RFID_CARD_TYPE_TEST:
        mfg_make_mfg_test_card();
        break;
    case RFID_CARD_TYPE_QC_ID:
        mfg_make_mfg_qc_card();
        break;
    case RFID_CARD_TYPE_MFG:
        mfg_make_mfg_date_card();
        break;
    default:
        break;
    }

    return 0;
}

int mfg_card_poll(void)
{
    switch(rc522_get_card_status())
    {
    case RC522_IDLE:
        rc522_find_card();
        break;
    case RC522_FIND_CARD:
        // rc522_read_test();
        // rc522_read_all_blk();
        // OTA
        // mfg_make_function_card(RFID_CARD_TYPE_UPGRADE);
        // 进入模式
        // mfg_make_function_card(RFID_CARD_TYPE_TEST);
        // 设置生产日期
        // mfg_make_function_card(RFID_CARD_TYPE_MFG);
        // 设置质检员编号
        mfg_make_function_card(RFID_CARD_TYPE_QC_ID);
        rc522_set_card_status(RC522_WAIT_REMOVE);
        break;
    case RC522_WAIT_REMOVE:
        rc522_wait_remove_card();
        break;
    default:
        break;
    }
}

